#include "Pinea.h"
#include <iostream>

// 输入管理类：处理键盘按键状态检测
class Input {
private:
	// 当前帧按键状态数组
	static bool keys[512];
	// 上一帧按键状态数组
	static bool lastKeys[512];

public:
	// 更新按键状态（按下/释放）
	static void update(int key, bool pressed) {
		lastKeys[key] = keys[key];
		keys[key] = pressed;
	}
	// 检测按键是否持续按下
	static bool isKeyPressed(int key) {
		return keys[key];
	}
	// 检测按键是否刚刚按下（仅触发一次）
	static bool isKeyDown(int key) {
		bool result = keys[key] && !lastKeys[key];
		if (result) {
			lastKeys[key] = true; // 防止重复触发
		}
		return result;
	}
	// 检测按键是否刚刚释放（仅触发一次）
	static bool isKeyUp(int key) {
		bool result = !keys[key] && lastKeys[key];
		if (result) {
			lastKeys[key] = false; // 防止重复触发
		}
		return result;
	}
};

// 初始化静态成员变量
bool Input::keys[512] = { false };
bool Input::lastKeys[512] = { false };


int main() {
	// 初始化引擎，创建标题为"PineaTest"、尺寸800x600的窗口
	pineaInit("PineaTest", 800, 600);
	PineaEvent event;						  // 事件对象
	PineaColor bgColor = { 50, 50, 50, 255 }; // 背景色（深灰色）

	// 测试矩形（位置、大小和颜色）
	PineaRect rect = { 100, 150, 60, 60 };
	PineaColor rectColor = { 30, 30, 30, 255 };

	// 加载图像资源
	PineaImage* bgImage = pineaLoadImage("PineaTest/assets/images/bg.png");		   // 背景图
	PineaImage* playerImage = pineaLoadImage("PineaTest/assets/images/mario.png"); // 玩家图像
	// 玩家图像源区域（从原图裁剪的区域）和目标区域（屏幕上绘制的位置和大小）
	PineaRect playerSrc = { 16 * 6, 16 * 2, 16, 16 };
	PineaRect playerDst = { 100, 200, 16 * 2.68f, 16 * 2.68f };

	// 加载音频资源
	PineaAudio* bgm = pineaLoadMusic("PineaTest/assets/sounds/bgm.mp3");		// 背景音乐
	pineaPlayMusic(bgm, true);													// 循环播放背景音乐
	PineaAudio* jumpSound = pineaLoadSound("PineaTest/assets/sounds/jump.wav"); // 跳跃音效

	// 时间控制变量（用于固定帧率更新）
	uint64_t lastTime = pineaGetTime();	  // 上一帧时间
	uint64_t currentTime;				  // 当前时间
	uint64_t accTime = 0;				  // 累计时间
	uint64_t deltaTime = 1000000000 / 60; // 每帧目标时间（60帧/秒，单位：纳秒）
	float deltaTimeF = 1 / 60.0f;		  // 每帧时间（秒）

	pineaShow(); // 显示窗口

	// 主循环标志
	bool running = true;
	while (running) {
		// 事件处理循环：处理所有待处理事件
		while (pineaPollEvent(&event)) {
			if (event.type == PINEA_EVENT_QUIT) {
				// 窗口关闭事件：退出主循环
				running = false;
			} else if (event.type == PINEA_EVENT_KEY_DOWN) {
				// 按键按下事件：更新按键状态为按下
				Input::update(event.key, true);
			} else if (event.type == PINEA_EVENT_KEY_UP) {
				// 按键释放事件：更新按键状态为释放
				Input::update(event.key, false);
			} else {
				// 输出其他事件信息（调试用）
				std::cout << event.type << "," << event.key << ","
						  << event.x << "," << event.y
						  << std::endl;
			}
		}

		// 时间更新：计算帧间隔并累计时间
		currentTime = pineaGetTime();
		accTime += currentTime - lastTime;
		lastTime = currentTime;

		// 固定帧率更新：当累计时间达到目标帧时间时执行更新
		if (accTime >= deltaTime) {
			while (accTime >= deltaTime) {
				accTime -= deltaTime;

				// 游戏逻辑更新
				// 键盘控制玩家移动（WASD键）
				if (Input::isKeyPressed(PINEA_KEY_A)) {
					playerDst.x -= deltaTimeF * 250; // 左移
				}
				if (Input::isKeyPressed(PINEA_KEY_D)) {
					playerDst.x += deltaTimeF * 250; // 右移
				}
				if (Input::isKeyPressed(PINEA_KEY_W)) {
					playerDst.y -= deltaTimeF * 250; // 上移
				}
				if (Input::isKeyPressed(PINEA_KEY_S)) {
					playerDst.y += deltaTimeF * 250; // 下移
				}
				// 空格键播放跳跃音效
				if (Input::isKeyDown(PINEA_KEY_SPACE)) {
					pineaPlaySound(jumpSound, 0);
				}
				// H键播放背景音乐
				if (Input::isKeyDown(PINEA_KEY_H)) {
					pineaPlayMusic(bgm, true);
				}
				// J键暂停音乐
				if (Input::isKeyDown(PINEA_KEY_J)) {
					pineaPauseMusic();
				}
				// K键恢复音乐
				if (Input::isKeyDown(PINEA_KEY_K)) {
					pineaResumeMusic();
				}
				// L键停止音乐
				if (Input::isKeyDown(PINEA_KEY_L)) {
					pineaStopMusic();
				}
			}

			// 渲染部分
			pineaClear(&bgColor); // 清空屏幕为背景色

			// 绘制背景图（全屏绘制）
			pineaDrawImage(bgImage, nullptr, nullptr, 0, 0);
			// 绘制测试矩形
			pineaFillRect(&rect, &rectColor);
			// 绘制玩家图像（带旋转和翻转效果）
			pineaDrawImage(playerImage, &playerSrc, &playerDst, 30, PINEA_FLIP_HORIZONTAL | PINEA_FLIP_VERTICAL);

			pineaRender(); // 刷新屏幕显示
		}
	}

	// 释放资源
	pineaDropImage(bgImage);
	pineaDropImage(playerImage);
	pineaDropMusic(bgm);
	pineaDropSound(jumpSound);
	pineaQuit(); // 退出引擎并释放所有资源

	return 0;
}